package com.tanhua.server.controller;

import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.vo.PageResult;
import com.tanhua.model.vo.SettingsVo;
import com.tanhua.model.vo.UserInfoVo;
import com.tanhua.server.interceptor.UserHolder;
import com.tanhua.server.service.UsersService;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/users")
public class UsersController {

    @Autowired
    private UsersService usersService;

    /**
     * 根据id查询用户信息
     * 接口路径：GET
     * 请求参数：/users?userID=123
     *    Query：userID （可能为null）
     * 请求头参数：Authorization （当前操作的用户id）
     * 响应数据
     *    UserInfo
     *
     * 参数解析：
     *    userID：查询其他用户的id
     *    当userID！=null：表示查询其他用户的资料
     *    当userID == null : 表示查询当前用户（解析Authorization）
     */
    @GetMapping
    public UserInfoVo users(Long userID,@RequestHeader("Authorization") String token) {
        Long userId = userID;
        if(userID == null) {
            //1.1、判断token
            boolean verifyToken = JwtUtils.verifyToken(token);
            if(!verifyToken) {
                throw new RuntimeException("用户未登录");
            }
            //1.2、解析token （用户id）
            Claims claims = JwtUtils.getClaims(token);
            userId = claims.get("id", Long.class);
        }
        //调用service查询
        UserInfoVo info = usersService.findUserInfoById(userId);
        return info;
    }

    /**
     * 更新用户资料
     * PUT
     * 请求参数：
     *   Body：UserInfo
     * 请求头参数：Authorization
     * 返回值：void
     */
    @PutMapping
    public void updateUserInfo(@RequestBody UserInfo info) {
        //1、获取参数
        //1.1、判断token
//        boolean verifyToken = JwtUtils.verifyToken(token);
//        if(!verifyToken) {
//            throw new RuntimeException("用户未登录");
//        }
        //1.2、解析token （用户id）
//        Claims claims = JwtUtils.getClaims(token);
//        Long userId = claims.get("id", Long.class);
        Long userId = UserHolder.getUserId();
        //1.3、设置到info对象
        info.setId(userId);
        //2、调用service
        usersService.updateUserInfo(info);
    }

    /**
     * 查询通用设置
     * 接口路径：GET  /settings
     * 返回值：
     *  SettingsVo
     */
    @GetMapping("/settings")
    public ResponseEntity settings() {
        //1、调用service，获取SettingsVo
        SettingsVo vo = usersService.settings();
        //2、构造返回值
        return ResponseEntity.ok(vo);
    }

    /**
     * 设置陌生人问题
     * 接口路径：POST  /questions
     * 参数Body: content
     *   {
     *       "content":"问题"
     *   }
     * 返回：void
     */
    @PostMapping("/questions")
    public ResponseEntity questions(@RequestBody Map map) {
        //1、获取参数
        String content = map.get("content").toString();
        //2、调用service
        usersService.questions(content);
        //3、返回
        return ResponseEntity.ok(null);
    }

    /**
     * 设置通知开关
     * 接口路径： POST   /notifications/setting
     * 参数Body
     *    likeNotification，pinglunNotification，gonggaoNotification
     * 返回：void
     */
    @PostMapping("/notifications/setting")
    public ResponseEntity setting(@RequestBody Map map) {
        //1、获取参数
        Boolean like = (Boolean) map.get("likeNotification");
        Boolean pinglun = (Boolean) map.get("pinglunNotification");
        Boolean gonggao = (Boolean) map.get("gonggaoNotification");
        //2、调用service
        usersService.setting(like,pinglun,gonggao);
        //3、返回
        return ResponseEntity.ok(null);
    }

    /**
     * 分页查询黑名单数据
     * 接口路径：GET   /blacklist ?page=1&pagesize=2
     * 请求参数：Query
     *     page，pagesize
     * 返回值：PageResult
     */
    @GetMapping("/blacklist")
    public ResponseEntity blacklist(@RequestParam(defaultValue = "1") Integer page,
                                    @RequestParam(defaultValue = "10")  Integer pagesize) {
        //1、调用service
        PageResult vo = usersService.blacklist(page,pagesize);
        //2、构造返回
        return ResponseEntity.ok(vo);
    }

    /**
     * 移除黑名单
     *  接口路径：DELETE  /blacklist/{uid}
     *  路径参数
     *     uid = 黑名单的用户id
     */
    @DeleteMapping("/blacklist/{uid}")
    public ResponseEntity delBlacklist(@PathVariable("uid") Long blackUserId) {
        //1、调用service
        usersService.delBlacklist(blackUserId);
        //2、构造返回
        return ResponseEntity.ok(null);
    }
}
